import {dynamicRouteConfigs, staticRouteConfigs} from '@/config/router.config'

const permission = {
  state: {
    routers: staticRouteConfigs,
    addRouters: []
  },
  getters: {
    dynamicMenus(state, getters, rootState, rootGetters) {
      const root = rootState.user.root
      const accessibleViews = rootState.user.role.accessibleViews
      console.debug('-----dynamicRouteConfigs: %o',dynamicRouteConfigs)
      const routes = dynamicRouteConfigs.find(r => r.path === '/').children
      console.debug('-----routes: %o',routes)
      const menus = filterVisibleMenus(routes, root, accessibleViews)
      console.debug('-----menus: %o',menus)
      //console.debug(JSON.stringify(menus))
      return menus
    }
  },
  mutations: {
    SET_ROUTERS: (state, routers) => {
      state.addRouters = routers
      state.routers = staticRouteConfigs.concat(routers)
    }
  },
  actions: {}
}


/**
 * 过滤出用户能看到的菜单
 * @param routes 路由
 * @param root 用户是否超级管理员
 * @param roles 用户的角色拥有的菜单、按钮访问权限
 */
function filterVisibleMenus(routes, root, accessibleViews) {
  // 如果是超级管理员，直接能看到所有页面，不用过滤
  if (root) {
    return routes
  }
  // 本层可访问的路由
  const visibleRoutes = routes.filter(r => routeCanBeSeen(r, accessibleViews))
  // 遍历下一层
  visibleRoutes.forEach(r => {
    if (r.children && r.children.length > 0) {
      r.children = filterVisibleMenus(r.children, root, accessibleViews)
    }
  })
  return visibleRoutes
}

/**
 * 判断一个路由是否可见
 * @param route 一个路由节点
 * @param accessibleViews 当前用户可访问的权限
 * @returns {boolean}
 */
function routeCanBeSeen(route, accessibleViews) {
  const rHidden = route.hidden
  const rPath = route.path
  const rName = route.name
  const rChildren = route.children ? route.children : [] // 当前节点的子节点
  const rPermission = route.meta ? route.meta.permission : null // 当前节点设置的访问权限

  if (rHidden) {
    console.debug('route.path: %o, route.name: %o, 隐藏', rPath, rName)
    // 路由设置了隐藏的，不可见
    return false
  }
  if (!rPermission || rPermission === '') {
    console.debug('route: %o, route.path: %o, route.name: %o, 不需要权限', route, rPath, rName)
    // 路由没有设置需要访问权限的，可见
    return true
  }

  // 用户拥有的权限 与 路由上声明需要的权限，做交集。
  const canBeSeen = accessibleViews.some(code => rPermission === code)
  if (canBeSeen) {
    console.debug('route.path: %o, route.name: %o, 可访问', rPath, rName)
    // 当前节点可访问
    return true
  } else {
    // 当前节点不可访问

    // 如果当前节点的permission是模糊匹配的，需要检查子孙节点是否可访问
    const checkChildren = (rPermission === '*' && rChildren.length > 0)
    if (checkChildren) {
      const childrenCanBeSeen = rChildren.some(r => routeCanBeSeen(r, accessibleViews))
      console.debug('route.path: %o, route.name: %o, 检查子孙节点是否可访问: %o', rPath, rName, childrenCanBeSeen)
      return childrenCanBeSeen
    } else {
      console.debug('route.path: %o, route.name: %o, 不检查子孙节点，直接返回[不]可访问', route.path, route.name)
      return false
    }
  }
}

export default permission
